/**
 * 事件组条目
 */
#pragma once

#include "EventHash.h"
#include "EventObject.h"
#include "EventString.h"
#include "EventType.h"

#include <time.h>

/* 事件组单条目对象 */
typedef struct _GroupItem GroupItem;
#define GROUP_ITEM(any) ((GroupItem *)any)

/* 事件组单条目对象的私有结构 */
typedef struct _GroupItemPriv GroupItemPriv;

struct _GroupItem
{
	EventObject parent_instance;

	/* 私有数据结构 */
	GroupItemPriv *priv;
	//
	time_t	create_date;
	time_t	modify_date;
	euint32 group_id;
	euint32 user_id;
	bool	g_can_write;
	bool	can_join;
};

typedef struct _GMember
{
	euint32 user_id;
	bool	can_write;
} GMember;

extern GroupItem *group_item_new(void);
//
extern const EventString *group_item_get_group_name(GroupItem *self);
extern EventString	 *group_item_dup_group_name(GroupItem *self);

/**
 * 设置事件组名称。注意，EventString 对象将被引用一次。
 */
extern void group_item_set_group_name(GroupItem *self, EventString *group_name);

/* 重置 GroupItem 的 GMember 迭代器 */
extern void group_item_iter_member_reset(GroupItem *self);
/* 迭代 GroupItem 对象 */
extern GMember *group_item_iter_get_with_member(GroupItem *self);
/* 向 GroupItem 对象设置一条 GMember 信息 */
extern void group_item_set_member(GroupItem *self, euint32 user_id,
				  bool can_write);
/**
 * @brief 从事件组中移除一条成员信息
 * @return 0: 成功，1: 用户不在事件组中，2: 空对象错误
 */
extern int group_item_remove_member(GroupItem *g_item, euint32 user_id);

/* 验证用户是否是该事件组中的可写用户 */
extern bool group_item_verify_write_flag(GroupItem *self, euint32 user_id);

/* 验证用户是否在组内 */
extern bool group_item_verify_user_existed(GroupItem *self, euint32 user_id);

extern void __group_item_print_hash_status(GroupItem *self);
